﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;
using System.Text;
using System.Windows.Forms;
using csharp.rad.general;
using ComponentFactory.Krypton.Toolkit;

namespace csharp.rad.GOVhotel
{
    public partial class RelDiário : KryptonForm
    {
        Database myDBase;
        public static String Ação;
        DateTime dataDia = DateTime.Today;
        int[] qtProd = new int[3];
        int[] tbCódCame = new int[6];
        int[] totAção = new int[5];
        string[] tabAções = { "nada", "faxina", "pós-saída", "atendimento",
            "dispensada", "limpeza", "reposição", "manutenção"};
        int qtItens, qRow, nmPág = 1;
        string conjCame, conjunto, conjto1, conjto2, qBlk;
        Retiradas rolSaída;

        public RelDiário(Database myDBase)
        {
            InitializeComponent();
            this.myDBase = myDBase;
        }

        private void Form_Load(object sender, EventArgs e)
        {
            menuDataDia_Changed();
        }

        private void menuDataDia_Changed()
        {
            menuDataDia.Text = dataDia.ToString("ddd dd MMMM");
            if (Ação == "Lançto") movtoDia_Cameira();
            else movtoDia_Blindex(); 
        }

        private void movtoDia_Cameira()
        {
            listaAções.Rows.Clear();
            conjunto = "";
            Operações tabOpera = new Operações(myDBase);
            tabOpera.Data = dataDia;
            int dbRet = tabOpera.ListaDia();
            if (dbRet != 0)
            {
                MessageBox.Show("Favor avisar a RamaSoft" + "\n"
                    + "referência: RelDiárioLoadOpera" + "\n" + tabOpera.MsgErro,
                    "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (tabOpera.Items.Count == 0) return;
            for (int xx = 0; xx < tabOpera.Items.Count; xx++)
            {
                conjunto = "";
                int numAção = tabOpera.Items[xx].Número;
                int[] tbCódCame = new int[6] {tabOpera.Items[xx].Cameira_1, tabOpera.Items[xx].Cameira_2,
                    tabOpera.Items[xx].Cameira_3, tabOpera.Items[xx].Cameira_4,
                    tabOpera.Items[xx].Cameira_5, tabOpera.Items[xx].Cameira_6};
                for (int qq = 0; qq < 6; qq++)
                {
                    if (tbCódCame[qq] == 0) break;
                    Cameira regCame = new Cameira(myDBase);
                    regCame.Código = tbCódCame[qq];
                    dbRet = regCame.Obter();
                    if (dbRet != 0)
                    {
                        MessageBox.Show("Favor avisar a RamaSoft" + "\n"
                            + "referência: RelDiárioMontaCame" + "\n" + regCame.MsgErro,
                            "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                    conjunto = conjunto + regCame.Nome.Trim() + " / "; 
                }
                Reposições queRepos = new Reposições(myDBase);
                queRepos.Número = numAção;
                dbRet = queRepos.Lista();
                if (dbRet != 0)
                {
                    MessageBox.Show("Favor avisar a RamaSoft" + "\n"
                        + "referência: RelDiárioLoadRepos" + "\n" + queRepos.MsgErro,
                        "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                listaAções.Rows.Add(tabOpera.Items[xx].Local.ToString("0000") + conjunto,
                    conjunto, tabOpera.Items[xx].Local.ToString("0_000"),
                    tabAções[tabOpera.Items[xx].Ação], queRepos.Items[0].Quantidade.ToString(),
                    queRepos.Items[1].Quantidade.ToString(), queRepos.Items[2].Quantidade.ToString(),
                    queRepos.Items[3].Quantidade.ToString(), tabOpera.Items[xx].NumPessoas.ToString(),
                    tabOpera.Items[xx].Saída.ToString("dd/MM/yyyy"), tbCódCame[0].ToString("000") + 
                    tbCódCame[1].ToString("000") + tbCódCame[2].ToString("000") + tbCódCame[3].ToString("000") +
                    tbCódCame[4].ToString("000") + tbCódCame[5].ToString("000"));
            }
            listaAções.Sort(açCamara, ListSortDirection.Ascending);
            rolSaída = new Retiradas(myDBase);
            rolSaída.Data = dataDia;
            dbRet = rolSaída.ListaDiaBlocoRepo();
            if (dbRet != 0)
            {
                MessageBox.Show("Favor avisar a RamaSoft" + "\n"
                    + "referência: RelDiárioLoadSaída" + "\n" + rolSaída.MsgErro,
                    "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            conjunto = listaAções.Rows[0].Cells[1].Value.ToString();
            string qLocal = listaAções.Rows[0].Cells[0].Value.ToString();
            qBlk = qLocal.Substring(0, 1);
            int final = listaAções.Rows.Count;
            for (int rw = 0; rw < final; rw++)
            {
                if (listaAções.Rows[rw].Cells[1].Value.ToString() != conjunto)
                {
                    movtoDia_Cameira_Total();
                    conjunto = listaAções.Rows[rw].Cells[1].Value.ToString();
                    qLocal = listaAções.Rows[rw].Cells[0].Value.ToString();
                    qBlk = qLocal.Substring(0, 1);
                }
                totAção[0] = totAção[0] + 1;
                for (int kk = 1; kk < 5; kk++)
                {
                    totAção[kk] = totAção[kk] + Convert.ToInt32(listaAções.Rows[rw].Cells[kk + 3].Value);
                }
                string conjCódigo = listaAções.Rows[rw].Cells[10].Value.ToString();
                for (int ff = 0; ff < 6; ff++)
                {
                    tbCódCame[ff] = Convert.ToInt32(conjCódigo.Substring(ff * 3, 3));
                }
            }
            movtoDia_Cameira_Total();
            listaAções.Sort(açOrdem, ListSortDirection.Ascending);
        }

        private void movtoDia_Cameira_Total()
        {
            listaAções.Rows.Add(qBlk + "888" + conjunto, "                    - - - total", totAção[0].ToString(), " ",
                totAção[1].ToString(), totAção[2].ToString(), totAção[3].ToString(), totAção[4].ToString(), " ", " ");
            for (int yy = 0; yy < 5; yy++) { totAção[yy] = 0; }
            for (int nm = 0; nm < rolSaída.Items.Count; nm++)
            {
                if (rolSaída.Items[nm].Bloco.ToString() == qBlk)
                {
                    int idx = 28 - rolSaída.Items[nm].CódProduto;
                    if (rolSaída.Items[nm].CódProduto == 50)
                        totAção[4] = totAção[4] + rolSaída.Items[nm].Quantidade;
                    else totAção[idx] = totAção[idx] + rolSaída.Items[nm].Quantidade;
                }
            }
            listaAções.Rows.Add(qBlk + "999" + conjunto, "                    - - - retiradas", " ", " ",
                totAção[1].ToString(), totAção[2].ToString(), totAção[3].ToString(), totAção[4].ToString(), " ", " ");
            for (int yy = 0; yy < 5; yy++) { totAção[yy] = 0; }
        }

        private void movtoDia_Blindex()
        {
            listaAções.Rows.Clear();
            açAção.Visible = false;
            açProds1.Visible = false;
            açProds2.Visible = false;
            açProds3.Visible = false;
            açCamara.HeaderText = "Funcionário";
            listaAções.Width = 280;
            this.Width = 300;
            Operações tabOpera = new Operações(myDBase);
            tabOpera.Data = dataDia;
            int dbRet = tabOpera.ListaDiaBlindex();
            if (dbRet != 0)
            {
                MessageBox.Show("Favor avisar a RamaSoft" + "\n"
                    + "referência: LançBlindexLoadOpera" + "\n" + tabOpera.MsgErro,
                    "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            for (int xx = 0; xx < tabOpera.Items.Count; xx++)
            {
                Cameira queCame = new Cameira(myDBase);
                queCame.Código = Convert.ToInt32(tabOpera.Items[xx].Cameira_1.ToString());
                dbRet = queCame.Obter();
                if (dbRet != 0)
                {
                    MessageBox.Show("Favor avisar a RamaSoft" + "\n"
                        + "referência: LançBlindexMontaCame_1" + "\n" + queCame.MsgErro,
                        "Erro no acesso ao Banco de Dados", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                String blkApto = tabOpera.Items[xx].Local.ToString("0_000");
                listaAções.Rows.Add(queCame.Nome, tabOpera.Items[xx].Local.ToString("0_000"));
            }
        }

        private void menuDiaMenos_Click(object sender, EventArgs e)
        {
            dataDia = dataDia.AddDays(-1);
            if (dataDia < DateTime.Today.AddDays(-15)) menuDiaMenos.Enabled = false;
            menuDiaMais.Enabled = true;
            menuDataDia_Changed();
        }

        private void menuDiaMais_Click(object sender, EventArgs e)
        {
            dataDia = dataDia.AddDays(1);
            if (dataDia == DateTime.Today) menuDiaMais.Enabled = false;
            menuDiaMenos.Enabled = true;
            menuDataDia_Changed();
        }

        private void menuPrint_Click(object sender, EventArgs e)
        {
            qtItens = listaAções.Rows.Count;
            qRow = 0;
            PrintDocument docto = new PrintDocument();
            PaperSize tam_A4 = new PaperSize("tam_A4", 850, 1150);
            docto.DefaultPageSettings.PaperSize = tam_A4;  
            if (Ação == "Lançto") docto.PrintPage += new PrintPageEventHandler(this.DocLanço_PrintPage);
            else docto.PrintPage += new PrintPageEventHandler(this.DocBlindex_PrintPage);
            docto.Print();
        }

        private void DocLanço_PrintPage(object sender, PrintPageEventArgs ev)
        {
            Pen myPen = new Pen(Brushes.Black);
            Point pt1 = new Point(30, 53);
            Point pt2 = new Point(780, 53);
            ev.Graphics.DrawLine(myPen, pt1, pt2);
            Font myFont1 = new Font("Arial", 14);
            string loja = "Parque das Águas Quentes";
            ev.Graphics.DrawString(loja, myFont1, Brushes.Black, 30, 30);
            ev.Graphics.DrawString("Lançamentos do Dia", myFont1, Brushes.Black, 370, 30);
            ev.Graphics.DrawString(dataDia.ToString("dd/MM/yyyy"), myFont1, Brushes.Black, 670, 30);
            if (qRow > 0)
            {
                nmPág = nmPág + 1;
                ev.Graphics.DrawString("pág. " + nmPág.ToString(), myFont1, Brushes.Black, 720, 55);
            }
            Font myFont3 = new Font("Lucida Sans", 10, FontStyle.Underline);
            ev.Graphics.DrawString("Camareiras", myFont3, Brushes.Black, 30, 76);
            ev.Graphics.DrawString("Apartº", myFont3, Brushes.Black, 270, 76);
            ev.Graphics.DrawString("Ação", myFont3, Brushes.Black, 330, 76);
            int pox = 440;
            string[] tito_1 = new string[] { "papel  ", "sabo-", "saco", "rolo", "número" };
            string[] tito_2 = new string[] { "higiên.", "nete", "lixo", "papel", "pessoas" };
            int posXX = pox;
            for (int qq = 0; qq < 5; qq++)
            {
                ev.Graphics.DrawString(tito_1[qq], myFont3, Brushes.Black, posXX, 60);
                ev.Graphics.DrawString(tito_2[qq], myFont3, Brushes.Black, posXX, 76);
                posXX = posXX + 50;
            }
            ev.Graphics.DrawString("Saída", myFont3, Brushes.Black, posXX + 20, 76); 
            Font myFont4 = new Font("Lucida Sans", 10);
            Font myFont2 = new Font("Lucida Console", 10);
            int yPos = 0;
            for (int nmLin = 0; nmLin < 58; nmLin++)
            {
                if (qRow >= qtItens) break;
                yPos = (nmLin * 16) + 100;
                if (listaAções.Rows[qRow].Cells[1].Value.ToString() != conjCame)
                {
                    if (conjto2 != " ")
                    {
                        ev.Graphics.DrawString(conjto2, myFont4, Brushes.Black, 30, yPos);
                        conjto2 = " ";
                        yPos = yPos + 16;
                        nmLin = nmLin + 1;
                    }
                    if (listaAções.Rows[qRow].Cells[1].Value.ToString().Substring(0, 3) != "   ")
                    {
                        if (qRow > 0)
                        {
                            yPos = yPos + 16;
                            nmLin = nmLin + 1;
                        }
                        conjCame = listaAções.Rows[qRow].Cells[1].Value.ToString();
                        conjto1 = conjCame;
                        conjto2 = " ";
                        if (conjto1.Length > 35)
                        {
                            for (int px = 35; px > 10; px--)
                            {
                                if (conjto1[px] == '/')
                                {
                                    conjto2 = "  " + conjto1.Substring(px-1);
                                    conjto1 = conjto1.Substring(0, px + 1);
                                    break;
                                }
                            }
                        }
                    }
                    else conjto1 = listaAções.Rows[qRow].Cells[1].Value.ToString();
                    ev.Graphics.DrawString(conjto1, myFont4, Brushes.Black, 30, yPos);
                }
                else
                {
                    ev.Graphics.DrawString(conjto2, myFont4, Brushes.Black, 30, yPos);
                    conjto2 = " ";
                }
                ev.Graphics.DrawString(listaAções.Rows[qRow].Cells[2].Value.ToString(),
                    myFont4, Brushes.Black, 270, yPos);
                ev.Graphics.DrawString(listaAções.Rows[qRow].Cells[3].Value.ToString(),
                    myFont4, Brushes.Black, 330, yPos);
                int xxPos = 430;
                for (int kk = 4; kk < 9; kk++)
                {
                    string edição = listaAções.Rows[qRow].Cells[kk].Value.ToString();
                    edição = edição.PadLeft(5);
                    ev.Graphics.DrawString(edição, myFont2, Brushes.Black, xxPos, yPos);
                    xxPos = xxPos + 50;
                }
                ev.Graphics.DrawString(listaAções.Rows[qRow].Cells[9].Value.ToString(),
                    myFont4, Brushes.Black, xxPos + 20, yPos);
                qRow = qRow + 1;
            }
            if (qRow >= qtItens) ev.HasMorePages = false;
            else
            {
                ev.Graphics.DrawString("-  -  -  -  -  continua  -  -  -  -  -", myFont2, Brushes.Black, 200, yPos + 24);
                ev.HasMorePages = true;
            }
        }

        private void DocBlindex_PrintPage(object sender, PrintPageEventArgs ev)
        {
            Pen myPen = new Pen(Brushes.Black);
            Point pt1 = new Point(30, 53);
            Point pt2 = new Point(780, 53);
            ev.Graphics.DrawLine(myPen, pt1, pt2);
            Font myFont1 = new Font("Arial", 14);
            string loja = "Parque das Águas Quentes";
            ev.Graphics.DrawString(loja, myFont1, Brushes.Black, 30, 30);
            ev.Graphics.DrawString("Lançamentos do Dia (Blindex)", myFont1, Brushes.Black, 330, 30);
            ev.Graphics.DrawString(dataDia.ToString("dd/MM/yyyy"), myFont1, Brushes.Black, 640, 30);
            if (qRow > 0)
            {
                nmPág = nmPág + 1;
                ev.Graphics.DrawString("pág. " + nmPág.ToString(), myFont1, Brushes.Black, 720, 55);
            }
            Font myFont3 = new Font("Lucida Sans", 10, FontStyle.Underline);
            ev.Graphics.DrawString("Funcionários", myFont3, Brushes.Black, 30, 76);
            ev.Graphics.DrawString("Apartº", myFont3, Brushes.Black, 230, 76);
            Font myFont4 = new Font("Lucida Sans", 10);
            Font myFont2 = new Font("Lucida Console", 10);
            int yPos = 0;
            for (int nmLin = 0; nmLin < 58; nmLin++)
            {
                if (qRow >= qtItens) break;
                yPos = (nmLin * 16) + 100;
                ev.Graphics.DrawString(listaAções.Rows[qRow].Cells[0].Value.ToString(),
                    myFont4, Brushes.Black, 30, yPos);
                ev.Graphics.DrawString(listaAções.Rows[qRow].Cells[1].Value.ToString(),
                    myFont4, Brushes.Black, 230, yPos);
                qRow = qRow + 1;
            }
            if (qRow >= qtItens) ev.HasMorePages = false;
            else
            {
                ev.Graphics.DrawString("- - - - - - - - - - - - - - - - - - - -", myFont1, Brushes.Black, 200, yPos + 14);
                ev.HasMorePages = true;
            }
        }
    }
}
